package com.learn.a06_2_inventory.ui

import android.app.Application
import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory
import androidx.lifecycle.createSavedStateHandle
import androidx.lifecycle.viewmodel.CreationExtras
import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory
import com.learn.a06_2_inventory.InventoryApplication
import com.learn.a06_2_inventory.ui.home.HomeViewModel
import com.learn.a06_2_inventory.ui.item.ItemDetailsViewModel
import com.learn.a06_2_inventory.ui.item.ItemEditViewModel
import com.learn.a06_2_inventory.ui.item.ItemEntryViewModel

/**
 * ViewModel 工厂提供者（统一管理所有 ViewModel 的创建）
 * 设计目标：
 * - 集中管理 ViewModel 初始化逻辑
 * - 实现依赖注入（通过 InventoryApplication.container）
 */
object AppViewModelProvider {
    // 统一 ViewModel 工厂（支持多个 ViewModel 类型）
    val Factory = viewModelFactory {
        // ItemEditViewModel 初始化（带状态保存能力）
        initializer {
            ItemEditViewModel(
                this.createSavedStateHandle(), // 状态保存句柄（用于横竖屏切换等场景）
                inventoryApplication().container.itemsRepository
            )
        }

        // ItemEntryViewModel 初始化（注入仓库实例）
        initializer {
            ItemEntryViewModel(
                inventoryApplication().container.itemsRepository // 从容器获取仓库
            )
        }

        // ItemDetailsViewModel 初始化（带状态保存）
        initializer {
            ItemDetailsViewModel(
                this.createSavedStateHandle(),
                inventoryApplication().container.itemsRepository
            )
        }

        // HomeViewModel 初始化（注入仓库实例）
        initializer {
            HomeViewModel(
                inventoryApplication().container.itemsRepository
            )
        }
    }
}

/**
 * 扩展函数：从 CreationExtras 中获取 InventoryApplication 实例
 * 实现原理：通过 AndroidViewModelFactory.APPLICATION_KEY 获取 Application 上下文
 */
fun CreationExtras.inventoryApplication(): InventoryApplication =
    (this[AndroidViewModelFactory.APPLICATION_KEY] as InventoryApplication)
